<?php

namespace Unl\HomologacionBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Unl\HomologacionBundle\Entity\Unidad;
use Unl\HomologacionBundle\Form\UnidadType;

/**
 * Unidad controller.
 *
 * @Route("/unidad")
 */
class UnidadController extends Controller
{
    /**
     * Lists all Unidad entities.
     *
     * @Route("/{idMalla}/{numeroModulo}/index", name="unidad")
     * @Template()
     */
    public function indexAction($numeroModulo, $idMalla)
    {
        $sample = new Unidad();
        $sample->setNombre('');
         
        $searchForm = $this->createForm(new UnidadType(), $sample);
        $request = $this->getRequest();
        $searchForm->bindRequest($request);

//        $em = $this->getDoctrine()->getEntityManager();
        $entities = $this->findByModulo($numeroModulo, $idMalla, $sample->getNombre());
        
//        if ($sample->getNombre() == '') { 
//            $entities = $this->findByModulo($numeroModulo, $idMalla, $sample->getNombre());
//        }else { 
//             $entities = $this->findByModulo($numeroModulo, $idMalla);
//         }
        return array(
            'entities' => $entities,
            'numeroModulo' => $numeroModulo,
            'id_malla' => $idMalla,
            'search_form' => $searchForm->createView());
              
        
    }
    
    public function findByModulo($numeroModulo, $idMalla, $nombre ) {
        $em = $this->getDoctrine()->getEntityManager();
        $query = $em->createQuery('SELECT u FROM UnlHomologacionBundle:Unidad u ' .
                'JOIN u.modulo m ' .
                'JOIN m.mallaCurricular ma ' .
                'WHERE m.numeroModulo = :numeroModulo ' .
                'AND ma.id = :idMalla ' .
                'OR u.nombre LIKE :nombre '.
                'ORDER BY u.id');
        $query->setParameter('numeroModulo', $numeroModulo);
        $query->setParameter('idMalla', $idMalla);
        $query->setParameter('nombre', $nombre);
        
        $entities = $query->getResult();
        return $entities;
    }

    
    
        public function findModuloByNumeroAndMalla($numeroModulo, $idMalla) {
        $em = $this->getDoctrine()->getEntityManager();
        $query = $em->createQuery('SELECT m FROM UnlHomologacionBundle:Modulo m ' .
                'JOIN m.mallaCurricular ma ' .
                'WHERE m.numeroModulo = :numeroModulo ' .
                'AND ma.id = :idMalla ' .
                'ORDER BY m.id');
        $query->setParameter('numeroModulo', $numeroModulo);
        $query->setParameter('idMalla', $idMalla);
        $entity = $query->getSingleResult();
        return $entity;
    }
    /**
     * Finds and displays a Unidad entity.
     *
     * @Route("/{id}/{idmalla}/show", name="unidad_show")
     * @Template()
     */
    public function showAction($id, $idmalla)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('UnlHomologacionBundle:Unidad')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Unidad entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'delete_form' => $deleteForm->createView(),
            'id_malla' =>$idmalla,
            );
    }

    /**
     * Displays a form to create a new Unidad entity.
     *
     * @Route("/{numeroModulo}/{idmalla}/new", name="unidad_new")
     * @Template()
     */
    public function newAction($numeroModulo, $idmalla)
    {
        $entity = new Unidad();
        
        $unidadType = new UnidadType();
        $unidadType->setNumeroModulo($numeroModulo);
        $form= $this->createForm($unidadType, $entity);
        

        return array(
            'entity' => $entity,
            'edit_form'   => $form->createView(),
            'id_malla' => $idmalla,
            'numeroModulo'=> $numeroModulo,
        );
    }
    

    /**
     * Creates a new Unidad entity.
     *
     * @Route("/{numeroModulo}/{idmalla}/create", name="unidad_create")
     * @Method("post")
     * @Template("UnlHomologacionBundle:Unidad:new.html.twig")
     */
    public function createAction($numeroModulo, $idmalla)
    {
        
        $entity  = new Unidad();
        
        $request = $this->getRequest();
        $unidadType = new UnidadType();
        $unidadType->setNumeroModulo($numeroModulo);
        $form= $this->createForm($unidadType, $entity);
        $form->bindRequest($request);
     
        $modulo = $this->findModuloByNumeroAndMalla($numeroModulo, $idmalla);
        $entity->setModulo($modulo);
        $em = $this->getDoctrine()->getEntityManager();

        if ($form->isValid()) {
          
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('unidad', array('numeroModulo' => $numeroModulo,'idMalla'=> $idmalla, 'descripcion' => $entity->__toString())));
            
        } 

        return array(
            'entity' => $entity,
            'edit_form'   => $form->createView(),
            'id_malla' => $idmalla,
            'numeroModulo'=> $numeroModulo,
            'id_malla'     => $idmalla,
        );
    }

    /**
     * Displays a form to edit an existing Unidad entity.
     *
     * @Route("/{id}/{numeroModulo}/{idmalla}/edit", name="unidad_edit")
     * @Template()
     */
    public function editAction($id, $numeroModulo, $idmalla)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('UnlHomologacionBundle:Unidad')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Unidad entity.');
        }

        $unidadType = new UnidadType();
        $unidadType->setNumeroModulo($numeroModulo);
        $editForm = $this->createForm($unidadType, $entity);
      

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'id_malla'    => $idmalla,
            'numeroModulo' => $numeroModulo,
        );
    }

    
    
    
    
    /**
     * Edits an existing Unidad entity.
     *
     * @Route("/{id}/{numeroModulo}/{idmalla}/update", name="unidad_update")
     * @Method("post")
     * @Template("UnlHomologacionBundle:Unidad:edit.html.twig")
     */
    public function updateAction($id,$numeroModulo,$idmalla)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('UnlHomologacionBundle:Unidad')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Unidad entity.');
        }

        $originalTemas =array();
        foreach ($entity->getTemas() as $tema) $originalTemas[] = $tema;
        
        
        $unidadType = new UnidadType();
        $unidadType->setNumeroModulo($numeroModulo);
        $editForm   = $this->createForm($unidadType, $entity);
         

        $request = $this->getRequest();

        $editForm->bindRequest($request);
        $modulo = $this->findModuloByNumeroAndMalla($numeroModulo, $idmalla);
        $entity->setModulo($modulo);
        $em = $this->getDoctrine()->getEntityManager();

        if ($editForm->isValid()) {
            
            
            
                  // filtra $original para evitar aquellas que ya no estan presentes
            foreach ($entity->getTemas() as $tema) {
                foreach ($originalTemas as $key => $toDel) {
                    if ($toDel->getId() === $tema->getId()) {
                        unset($originalTemas[$key]);
                    }
                }
            }
            
            // Se quita la relacion entre carrera y area
            foreach ($originalTemas as $tema) {
                // remove the Task from the Tag
                $tema->setUnidad(null); //->removeElement($task);
                $em->persist($tema);
                //$em->remove($carrera);
            
            }
            
            
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('unidad', array('numeroModulo' => $numeroModulo, 'idMalla' => $idmalla, 'descripcion' => $entity->__toString())));
        }

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'numeroModulo'=> $numeroModulo,
            'id_malla'     => $idmalla,
        );
    }

    /**
     * Deletes a Unidad entity.
     *
     * @Route("/{id}/{idmalla}/delete", name="unidad_delete")
     * @Method("post")
     */
    public function deleteAction($id, $idmalla)
    {
        $form = $this->createDeleteForm($id);
        $request = $this->getRequest();

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $entity = $em->getRepository('UnlHomologacionBundle:Unidad')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Unidad entity.');
            }

            $eliminar=$entity->__toString();
            $em->remove($entity);
            $em->flush();
        }

        
        return $this->redirect($this->generateUrl('unidad', array('numeroModulo' => $entity->getModulo(), 'idMalla'=>$idmalla, 'eliminar'=> $eliminar)));
    }

    private function createDeleteForm($id)
    {
        return $this->createFormBuilder(array('id' => $id))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
}
